# @Time : 2020/7/11 13:57
# @Author : Fioman 
# @Phone : 13149920693
"""
定义__getitem__方法,只实现序列协议的一部分,这样足够访问元素,迭代和使用in运算符了.
"""

class Foo(object):
    def __getitem__(self, pos):
        return range(0,30,10)[pos]

if __name__ == '__main__':
    f = Foo()
    print("f(1) = {}".format(f[1]))

    for i in f:
        print(i)

    print("20 in f = {}".format(20 in f))
    print("15 in f = {}".format(15 in f))

    """
    虽然没有__iter__方法,但是Foo实例是可迭代对象,因为发现有__getitem__方法时,Python会调用它,传入从0开始的整数索引,尝试迭代对象(这是一种后备机制.)
    尽管没有实现__contains__方法,但是Python足够的智能,能迭代Foo实例,因此也能使用in运算符:Python会做全面检查,看看有没有指定的元素.
    
    综上,鉴于序列协议的重要性,如果没有__iter__和__contains__方法,Python会调用__getitem__方法,设法让迭代和in运算符可用.
    """